local status_ok, which_key = pcall(require, "which-key")
if not status_ok then
    vim.notify("Plugin which-key is not existed");
    return
end

which_key.register({
    -- a b c d e f g h i j k l m n o p q r s t u v w x y z
    -- b = {
    --     name = "Buffer",
    --     c = { '<cmd>tabnew<cr>:e ', "Create buffer" },
    --     x = { '<cmd>bdelete<cr>', 'Close buffer' },
    -- },

    -- c = { "<cmd>Neotree close<cr>", "Close filetree" },
    -- e = { "<cmd>Neotree<cr>", "Open filetree" },

    -- f = {
    --     name = "Telescope",
    --     b = { '<cmd>lua require("telescope.builtin").buffers',    "Find buff" }, -- 查找buffer
    --     f = { '<cmd>lua require("telescope.builtin").find_files', "Find file" }, -- 搜索文件
    --     h = { '<cmd>lua require("telescope.builtin").help_tags',  "Find help" }, -- 搜索帮助文档
    --     m = { "<cmd>lua vim.lsp.buf.format()<cr>", "Format" },
    -- },

    -- g = {
    --     name = "Git",
    --     I = { '<cmd>lua vim.lsp.buf.implementation()<cr>' },
    --     r = { '<cmd>lua vim.lsp.buf.references()<cr>' }, -- gd can handler that
    -- },

    -- h = {
    --     b = { '<cmd>lua require"gitsigns".blame_line{full=true}<CR>' },
    --     d = { '<cmd>Gitsigns diffthis<CR>' },
    --     D = { '<cmd>lua require"gitsigns".diffthis("~")<CR>' },
    --     p = { '<cmd>Gitsigns preview_hunk<CR>' }, -- 展示当前hunk的修改
    --     R = { '<cmd>Gitsigns reset_buffer<CR>' },
    --     r = { ':Gitsigns reset_hunk<CR>' },
    --     S = { '<cmd>Gitsigns stage_buffer<CR>' },
    --     s = { ':Gitsigns stage_hunk<CR>' },          -- 添加所在hunk到仓库 git add
    --     u = { '<cmd>Gitsigns undo_stage_hunk<CR>' }, -- 取消添加所在hunk到仓库 git add
    -- },

    -- l = {
    --     name = "LSP",
    --     a = { '<cmd>lua vim.lsp.buf.code_action()<cr>', "Code action" },
    --     f = { '<cmd>lua vim.lsp.buf.format{ async = true }<cr>', "Format" },
    --     g = { 'require("telescope.builtin").live_grep', "Live grep" },
    --     i = { '<cmd>LspInfo<cr>', "Lsp info" },
    --     I = { '<cmd>LspInstallInfo<cr>', "Lsp install info" },
    --     j = { '<cmd>lua vim.diagnostic.goto_next({border="rounded"})<cr>', "Go to next diag" },
    --     k = { '<cmd>lua vim.diagnostic.goto_prev({border="rounded"})<cr>', "Go to prev diag" },
    --     q = { '<cmd>lua vim.diagnostic.setloclist()<cr>', "Setloclist" },
    --     s = { '<cmd>lua vim.lsp.buf.signature_help()<cr>' },
    -- },

    -- n = {
    --     name = 'No something',
    --     h = { '<cmd>nohl<cr>', 'No highlight' },
    --     w = { '<cmd>set nowrap<cr>', 'No wrap' },
    -- },


    -- R = {
    --     name = "Replace",
    -- },

    -- r = {
    --     n = { '<cmd>lua vim.lsp.buf.rename()<cr>', "Rename" },
    -- },

    -- t = {
    --     name = "Trouble",
    --     b = { '<cmd>Gitsigns toggle_current_line_blame<CR>' },
    --     d = { "<cmd>Trouble document_diagnostics<cr>", "Document Diagnostics" },
    --     e = { "<cmd>Trouble workspace_diagnostics<cr>", "Workspace Diagnostics" },
    --     g = { "<cmd>Gitsigns setloclist<cr>", "Open changed hunk" },
    --     q = { "<cmd>Trouble quickfix<cr>", "Quick Fix" },
    --     t = { "<cmd>Trouble<cr>", "ToggleTrouble" },
    --     u = { "<cmd>Trouble lsp_references<cr>", "Usage" },
    --     td = { '<cmd>Gitsigns toggle_deleted<CR>' },
    -- },

    -- s = {
    --     o = { ':SymbolsOutline<cr>', 'Symbols outline' },
    --     e = { '<C-w>=', 'Split equally' },
    --     v = { '<C-w>v', 'Split vertically' },
    --     x = { '<cmd>close<cr>', 'Close window' },
    -- }
},
{
    mode = "n", -- NORMAL mode
    -- prefix: use "<leader>f" for example for mapping everything related to finding files
    -- the prefix is prepended to every mapping part of `mappings`
    prefix = "<leader>",
    buffer = nil,   -- Global mappings. Specify a buffer number for buffer local mappings
    silent = true,  -- use `silent` when creating keymaps
    noremap = true, -- use `noremap` when creating keymaps
    nowait = false, -- use `nowait` when creating keymaps
    expr = false,   -- use `expr` when creating keymaps
})
-- Call the setup function to change the default behavior

which_key.setup({
    plugins = {
        marks = true,     -- shows a list of your marks on ' and `
        registers = true, -- shows your registers on " in NORMAL or <C-r> in INSERT mode
        -- the presets plugin, adds help for a bunch of default keybindings in Neovim
        -- No actual key bindings are created
        spelling = {
            enabled = true,   -- enabling this will show WhichKey when pressing z= to select spelling suggestions
            suggestions = 20, -- how many suggestions should be shown in the list?
        },
        presets = {
            operators = true,    -- adds help for operators like d, y, ...
            motions = true,      -- adds help for motions
            text_objects = true, -- help for text objects triggered after entering an operator
            windows = true,      -- default bindings on <c-w>
            nav = true,          -- misc bindings to work with windows
            z = true,            -- bindings for folds, spelling and others prefixed with z
            g = true,            -- bindings for prefixed with g
        },
    },
    -- add operators that will trigger motion and text object completion
    -- to enable all native operators, set the preset / operators plugin above
    operators = { gc = "Comments" },
    key_labels = {
        -- override the label used to display some keys. It doesn't effect WK in any other way.
        -- For example:
        -- ["<space>"] = "SPC",
        -- ["<cr>"] = "RET",
        -- ["<tab>"] = "TAB",
    },
    motions = {
        count = true,
    },
    icons = {
        breadcrumb = "»", -- symbol used in the command line area that shows your active key combo
        separator = "➜", -- symbol used between a key and it's label
        group = "+", -- symbol prepended to a group
    },
    popup_mappings = {
        scroll_down = "<c-d>", -- binding to scroll down inside the popup
        scroll_up = "<c-u>",   -- binding to scroll up inside the popup
    },
    window = {
        border = "rounded",       -- none, single, double, shadow
        position = "bottom",      -- bottom, top
        margin = { 1, 0, 1, 0 },  -- extra window margin [top, right, bottom, left]. When between 0 and 1, will be treated as a percentage of the screen size.
        padding = { 1, 2, 1, 2 }, -- extra window padding [top, right, bottom, left]
        winblend = 0,             -- value between 0-100 0 for fully opaque and 100 for fully transparent
        zindex = 1000,            -- positive value to position WhichKey above other floating windows.
    },
    layout = {
        height = { min = 4, max = 25 },                                               -- min and max height of the columns
        width = { min = 22, max = 50 },                                               -- min and max width of the columns
        spacing = 3,                                                                  -- spacing between columns
        align = "left",                                                               -- align columns left, center or right
    },
    ignore_missing = false,                                                           -- enable this to hide mappings for which you didn't specify a label
    hidden = { "<silent>", "<cmd>", "<Cmd>", "<CR>", "^:", "^ ", "^call ", "^lua " }, -- hide mapping boilerplate
    show_help = true,                                                                 -- show a help message in the command line for using WhichKey
    show_keys = true,                                                                 -- show the currently pressed key and its label as a message in the command line
    triggers = "auto",                                                                -- automatically setup triggers
    -- triggers = {"<leader>"} -- or specifiy a list manually
    -- list of triggers, where WhichKey should not wait for timeoutlen and show immediately
    triggers_nowait = {
        -- marks
        "`",
        "'",
        "g`",
        "g'",
        -- registers
        '"',
        "<c-r>",
        -- spelling
        "z=",
    },
    triggers_blacklist = {
        -- list of mode / prefixes that should never be hooked by WhichKey
        -- this is mostly relevant for keymaps that start with a native binding
        i = { "j", "k" },
        v = { "j", "k" },
    },
    -- disable the WhichKey popup for certain buf types and file types.
    -- Disabled by default for Telescope
    disable = {
        buftypes = {},
        filetypes = {},
    },
})
